import { HassConfig } from "home-assistant-js-websocket";
import memoizeOne from "memoize-one";
import { FrontendLocaleData } from "../../data/translation";
import { formatDateNumeric } from "./format_date";
import { formatTime } from "./format_time";
import { useAmPm } from "./use_am_pm";

// August 9, 2021, 8:23 AM
export const formatDateTime = (dateObj: Date, locale: FrontendLocaleData, config: HassConfig) =>
    formatDateTimeMem(locale, config.time_zone).format(dateObj);

const formatDateTimeMem = memoizeOne(
    (locale: FrontendLocaleData, serverTimeZone: string) =>
        new Intl.DateTimeFormat(
            locale.language === "en" && !useAmPm(locale) ? "en-u-hc-h23" : locale.language,
            {
                year: "numeric",
                month: "long",
                day: "numeric",
                hour: useAmPm(locale) ? "numeric" : "2-digit",
                minute: "2-digit",
                hour12: useAmPm(locale),
                timeZone: locale.time_zone === "server" ? serverTimeZone : undefined,
            }
        )
);

// Aug 9, 2021, 8:23 AM
export const formatShortDateTimeWithYear = (
    dateObj: Date,
    locale: FrontendLocaleData,
    config: HassConfig
) => formatShortDateTimeWithYearMem(locale, config.time_zone).format(dateObj);

const formatShortDateTimeWithYearMem = memoizeOne(
    (locale: FrontendLocaleData, serverTimeZone: string) =>
        new Intl.DateTimeFormat(
            locale.language === "en" && !useAmPm(locale) ? "en-u-hc-h23" : locale.language,
            {
                year: "numeric",
                month: "short",
                day: "numeric",
                hour: useAmPm(locale) ? "numeric" : "2-digit",
                minute: "2-digit",
                hour12: useAmPm(locale),
                timeZone: locale.time_zone === "server" ? serverTimeZone : undefined,
            }
        )
);

// Aug 9, 8:23 AM
export const formatShortDateTime = (
    dateObj: Date,
    locale: FrontendLocaleData,
    config: HassConfig
) => formatShortDateTimeMem(locale, config.time_zone).format(dateObj);

const formatShortDateTimeMem = memoizeOne(
    (locale: FrontendLocaleData, serverTimeZone: string) =>
        new Intl.DateTimeFormat(
            locale.language === "en" && !useAmPm(locale) ? "en-u-hc-h23" : locale.language,
            {
                month: "short",
                day: "numeric",
                hour: useAmPm(locale) ? "numeric" : "2-digit",
                minute: "2-digit",
                hour12: useAmPm(locale),
                timeZone: locale.time_zone === "server" ? serverTimeZone : undefined,
            }
        )
);

// August 9, 2021, 8:23:15 AM
export const formatDateTimeWithSeconds = (
    dateObj: Date,
    locale: FrontendLocaleData,
    config: HassConfig
) => formatDateTimeWithSecondsMem(locale, config.time_zone).format(dateObj);

const formatDateTimeWithSecondsMem = memoizeOne(
    (locale: FrontendLocaleData, serverTimeZone: string) =>
        new Intl.DateTimeFormat(
            locale.language === "en" && !useAmPm(locale) ? "en-u-hc-h23" : locale.language,
            {
                year: "numeric",
                month: "long",
                day: "numeric",
                hour: useAmPm(locale) ? "numeric" : "2-digit",
                minute: "2-digit",
                second: "2-digit",
                hour12: useAmPm(locale),
                timeZone: locale.time_zone === "server" ? serverTimeZone : undefined,
            }
        )
);

// 9/8/2021, 8:23 AM
export const formatDateTimeNumeric = (
    dateObj: Date,
    locale: FrontendLocaleData,
    config: HassConfig
) => `${formatDateNumeric(dateObj, locale, config)}, ${formatTime(dateObj, locale, config)}`;
